1 package edu.jiangxin.apktoolbox.convert.color.colorspace;
2
3 import java.awt.color.ColorSpace;
4 import java.io.Serial;
5
6 public class CmykColorSpace extends ColorSpace {
7 @Serial
8 private static final long serialVersionUID = 1L;
9
10 protected CmykColorSpace(int type, int numComponents) {
11 super(type, numComponents);
12 }
13
14 public static CmykColorSpace getInstance() {
15 return Holder.INSTANCE;
16 }
17
18 @Override
19 public float[] toRGB(float[] colorvalue) {
20 float c = colorvalue[0];
21 float m = colorvalue[1];
22 float y = colorvalue[2];
23 float k = colorvalue[3];
24
25 float r = 1 - Math.min(1, c * (1 - k) + k);
26 float g = 1 - Math.min(1, m * (1 - k) + k);
27 float b = 1 - Math.min(1, y * (1 - k) + k);
28
29 return new float[]{r, g, b};
30 }
31
32 @Override
33 public float[] fromRGB(float[] rgbvalue) {
34 float r = rgbvalue[0];
35 float g = rgbvalue[1];
36 float b = rgbvalue[2];
37
38 float k = 1 - Math.max(r, Math.max(g, b));
39 float c = (1 - r - k) / (1 - k);
40 float m = (1 - g - k) / (1 - k);
41 float y = (1 - b - k) / (1 - k);
42
43 return new float[]{c, m, y, k};
44 }
45
46 @Override
47 public float[] toCIEXYZ(float[] colorvalue) {
48 float[] rgb = toRGB(colorvalue);
49 return ColorSpace.getInstance(CS_sRGB).toCIEXYZ(rgb);
50 }
51
52 @Override
53 public float[] fromCIEXYZ(float[] colorvalue) {
54 float[] rgb = ColorSpace.getInstance(CS_sRGB).fromCIEXYZ(colorvalue);
55 return fromRGB(rgb);
56 }
57
58 private static class Holder {
59 private static final CmykColorSpace INSTANCE = new CmykColorSpace(TYPE_CMYK, 4);
60 }
61 }